package taskjs

import (
	"os"
	"path/filepath"
	"sync"

	"gitee.com/haodreams/golib/logs"
)

var cache = NewJsCache()

type FileInfo struct {
	Path      string
	Name      string //文件名
	ModiTime  int64  //秒
	LastCheck int64  // 最后一次检查时间
	Data      []byte
}

type JsCache struct {
	lock    sync.RWMutex
	cache   map[string]*FileInfo
	timeout int64 // 超时时间，单位秒
}

func NewJsCache() *JsCache {
	return &JsCache{
		cache:   make(map[string]*FileInfo),
		timeout: 5, //超时时间，单位秒
	}
}

func GetJs(path string, now int64) (fi *FileInfo, err error) {
	cache.lock.RLock()
	fi = cache.cache[path]
	cache.lock.RUnlock()
	if fi == nil {
		cache.lock.Lock()
		fi = new(FileInfo)
		fi.Path = path
		fi.Name = filepath.Base(path)
		cache.cache[path] = fi
		cache.lock.Unlock()
	}

	//检查文件更新时间是否超过了3秒
	if now-fi.LastCheck < cache.timeout {
		return fi, nil
	}
	fi.LastCheck = now

	//5秒内修改的文件不处理
	if now-fi.ModiTime < cache.timeout {
		return fi, nil
	}

	//超过2秒没有检查，需要重新检查
	stat, err := os.Stat(path)
	if err != nil {
		logs.Warn(err)
		return
	}
	if now - stat.ModTime().Unix() < cache.timeout {
		return fi, nil
	}

	if stat.ModTime().Unix() != fi.ModiTime {
		//修改时间不一致，需要重新加载
		logs.Info(fi.Path, "文件修改时间发生变化, 重新加载js脚本")
		data, err := os.ReadFile(path)
		if err != nil {
			logs.Warn(err)
			return fi, err
		}
		fi.Data = data
		fi.ModiTime = stat.ModTime().Unix()
	}

	return fi, nil
}
